// import com.alibaba.druid.sql.ast.SQLName_ptr;
// import com.alibaba.druid.sql.ast.SQLParameter_ptr;
// import com.alibaba.druid.sql.ast.SQLStatement_ptr;
// import com.alibaba.druid.sql.ast.SQLStatementImpl;
// import com.alibaba.druid.sql.ast.expr.SQLCharExpr_ptr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;
#pragma once
#include "../SQLStatementImpl.h"
#include "SQLCreateStatement.h"

class SQLCreateProcedureStatement : public SQLStatementImpl, virtual public SQLCreateStatement
{
public:
  SQLName_ptr definer;

  BOOL_ptr create = BOOL::TRUE;
  BOOL_ptr orReplace;
  SQLName_ptr name;
  SQLStatement_ptr block;
  SQLParameter_list_ptr parameters;

  // for oracle
  string_ptr javaCallSpec;

  SQLName_ptr authid;

  // for mysql
  BOOL_ptr deterministic;
  BOOL_ptr containsSql;
  BOOL_ptr noSql;
  BOOL_ptr readSqlData;
  BOOL_ptr modifiesSqlData;
  BOOL_ptr languageSql;

  string_ptr wrappedSource;

  SQLCharExpr_ptr comment;

  SQLCreateProcedureStatement();
  SHAREDOBJECT(SQLCreateProcedureStatement);

  // @Override
  void accept0(SQLASTVisitor_ptr visitor);

  SQLParameter_list_ptr getParameters();

  void setParameters(SQLParameter_list_ptr parameters);

  SQLName_ptr getName();

  void setName(SQLName_ptr name);

  SQLStatement_ptr getBlock();

  void setBlock(SQLStatement_ptr block);

  SQLName_ptr getAuthid();

  void setAuthid(SQLName_ptr authid);

  BOOL_ptr isOrReplace();

  void setOrReplace(BOOL_ptr orReplace);

  SQLName_ptr getDefiner();

  void setDefiner(SQLName_ptr definer);

  BOOL_ptr isCreate();

  void setCreate(BOOL_ptr create);

  string_ptr getJavaCallSpec();

  void setJavaCallSpec(string_ptr javaCallSpec);

  BOOL_ptr isDeterministic();

  void setDeterministic(BOOL_ptr deterministic);

  BOOL_ptr isContainsSql();

  void setContainsSql(BOOL_ptr containsSql);

  BOOL_ptr isNoSql();

  void setNoSql(BOOL_ptr noSql);

  BOOL_ptr isReadSqlData();

  void setReadSqlData(BOOL_ptr readSqlData);

  BOOL_ptr isModifiesSqlData();

  void setModifiesSqlData(BOOL_ptr modifiesSqlData);

  SQLParameter_ptr findParameter(long hash);

  BOOL_ptr isLanguageSql();

  void setLanguageSql(BOOL_ptr languageSql);

  SQLCharExpr_ptr getComment();

  void setComment(SQLCharExpr_ptr comment);

  string_ptr getWrappedSource();

  void setWrappedSource(string_ptr wrappedSource);
};
